์์ฑ: 2026-03-04 04:03:38์์ : 2026-03-04 04:03:38
JWT์ ํ ํฐ ๊ธฐ๋ฐ ์ธ์ฆ ๊ตฌํํ๊ธฐ: ์ธ์ ์๋ ๋ณด์ ์ค๊ณ
์ ํต์ ์ธ ์ธ์ ๋ฐฉ์์ ์๋ฒ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ์๋ฒ ํ์ฅ ์ ๊ด๋ฆฌ๊ฐ ์ด๋ ต๋ค๋ ๋จ์ ์ด ์์ต๋๋ค. **JWT(JSON Web Token)**๋ ์ธ์ฆ ์ ๋ณด๋ฅผ ํ ํฐ ์์ฒด์ ๋ด์ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๊ดํ๊ฒ ํจ์ผ๋ก์จ, **Stateless(์ํ ์์)**ํ ํ์ฅ์ด ์ฉ์ดํ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
1. JWT์ ๊ตฌ์กฐ
JWT๋ ์ (.)์ผ๋ก ๊ตฌ๋ถ๋ ์ธ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- Header: ํ ํฐ์ ํ์ ๊ณผ ์ฌ์ฉ ์ค์ธ ์ํธํ ์๊ณ ๋ฆฌ์ฆ (์: HS256).
- Payload: ํ ํฐ์ ๋ด์ ์ ๋ณด(Claim). ์ ์ ID, ๊ถํ, ๋ง๋ฃ ์๊ฐ ๋ฑ.
- Signature: ์๋ฒ๋ง ์๊ณ ์๋ ๋น๋ฐํค๋ก ์์ฑํ ์๋ช . ํ ํฐ์ ์๋ณ์กฐ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
2. JWT ์ธ์ฆ ์ํฌํ๋ก์ฐ
- ๋ก๊ทธ์ธ: ์ ์ ๊ฐ ์์ด๋/๋น๋ฒ์ผ๋ก ๋ก๊ทธ์ธ ์์ฒญ.
- ํ ํฐ ์์ฑ: ์๋ฒ๊ฐ ์ ํจ์ฑ์ ํ์ธํ๊ณ JWT๋ฅผ ์์ฑํ์ฌ ์๋ต.
- ์์ฒญ: ํด๋ผ์ด์ธํธ๋ ์ดํ ๋ชจ๋ ์์ฒญ์
Authorizationํค๋์Bearer <Token>์ ๋ฃ์ด ๋ณด๋. - ๊ฒ์ฆ: ์๋ฒ๋ ์๋ช ์ ํ์ธํ๊ณ , ์ ํจํ๋ฉด ์์ฒญ์ ์ฒ๋ฆฌ.
3. Spring Boot์์ JWT ๊ตฌํ (ํต์ฌ ์ฝ๋)
jjwt ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ ํฐ์ ์์ฑํ๊ณ ๊ฒ์ฆํ๋ ๋ก์ง์ ํต์ฌ์
๋๋ค.
public String createToken(String userPk, List<String> roles) {
Claims claims = Jwts.claims().setSubject(userPk);
claims.put("roles", roles);
Date now = new Date();
return Jwts.builder()
.setClaims(claims)
.setIssuedAt(now)
.setExpiration(new Date(now.getTime() + tokenValidTime)) // ๋ง๋ฃ ์๊ฐ ์ค์
.signWith(SignatureAlgorithm.HS256, secretKey) // ์ํธํ
.compact();
}4. JWT ์ฌ์ฉ ์ ์ฃผ์์ฌํญ
- ๋ฏผ๊ฐ ์ ๋ณด ๊ธ์ง: ํ์ด๋ก๋๋ ๋๊ตฌ๋ ๋์ฝ๋ฉํ ์ ์์ผ๋ฏ๋ก ๋น๋ฐ๋ฒํธ ๊ฐ์ ์ ๋ณด๋ ์ ๋ ๋ฃ์ง ๋ง์ธ์.
- ๋ง๋ฃ ์๊ฐ ์ค์ : ํ ํฐ์ด ํ์ทจ๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด Access Token์ ์๋ช ์ ์งง๊ฒ(์: 30๋ถ) ์ค์ ํ๊ณ , Refresh Token์ ๋ณํ ์ฌ์ฉํ์ธ์.
- Secret Key ๋ณด์: ๋น๋ฐํค๊ฐ ์ ์ถ๋๋ฉด ์ ์ฒด ๋ณด์์ด ๋ฌด๋์ง๋๋ค. ๋ฐ๋์ ํ๊ฒฝ ๋ณ์๋ Secret Manager๋ก ๊ด๋ฆฌํ์ธ์.
5. ๊ฒฐ๋ก
JWT๋ ํ๋์ ์ธ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ(MSA)์ ๋ชจ๋ฐ์ผ ์ฑ ์ฐ๋์ ๊ฐ์ฅ ์ ํฉํ ์ธ์ฆ ๋ฐฉ์์ ๋๋ค. ์๋ฒ์ ๋ถ๋ด์ ์ค์ด๊ณ ์ ์ฐํ ํ์ฅ์ ์ํ์ ๋ค๋ฉด JWT ๋์ ์ ์ ๊ทน ๊ณ ๋ คํด ๋ณด์ธ์!